//package com.snail.service;
//
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.JsonNode;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.snail.mapper.ProductRepository;
//import com.snail.model.entity.Product;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.data.domain.Page;
//import org.springframework.data.domain.PageRequest;
//import org.springframework.data.domain.Pageable;
//import org.springframework.data.domain.Sort;
//import org.springframework.data.elasticsearch.client.elc.QueryBuilders;
//import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
//import org.springframework.stereotype.Service;
//
//import javax.naming.directory.SearchResult;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * @author cici
// * @description 商品搜索服务
// * @date 2025/8/13 17:12
// */
//@Slf4j
//@Service
//@RequiredArgsConstructor
//public class ProductSearchService {
//    private final ProductRepository productRepository;
//    private final AIService aiService;
//    private final ElasticsearchOperations elasticsearchOperations;
//    private final ObjectMapper objectMapper;
//
//    /**
//     * 使用AI增强的商品搜索
//     */
//    public SearchResult searchWithAI(String query, Integer page, Integer size,
//                                     String category, Double minPrice, Double maxPrice) {
//        log.info("开始AI增强搜索: query={}, page={}, size={}", query, page, size);
//
//        // 1. AI分析搜索查询
//        String aiAnalysis = aiService.analyzeSearchQuery(query);
//        log.debug("AI分析结果: {}", aiAnalysis);
//
//        // 2. 提取AI分析的关键词和扩展词
//        List<String> expandedKeywords = extractExpandedKeywords(aiAnalysis, query);
//
//        // 3. 构建复合搜索查询
//        NativeSearchQuery searchQuery = buildEnhancedSearchQuery(
//                query, expandedKeywords, category, minPrice, maxPrice, page, size);
//
//        // 4. 执行搜索
//        SearchHits<Product> searchHits = elasticsearchOperations.search(searchQuery, Product.class);
//
//        // 5. 转换结果
//        List<Product> products = searchHits.getSearchHits().stream()
//                .map(SearchHit::getContent)
//                .collect(Collectors.toList());
//
//        return SearchResult.builder()
//                .query(query)
//                .aiAnalysis(aiAnalysis)
//                .products(products)
//                .totalElements(searchHits.getTotalHits())
//                .totalPages((int) Math.ceil((double) searchHits.getTotalHits() / size))
//                .currentPage(page)
//                .pageSize(size)
//                .expandedKeywords(expandedKeywords)
//                .build();
//    }
//
//    /**
//     * 构建增强的搜索查询
//     */
//    private NativeSearchQuery buildEnhancedSearchQuery(String originalQuery, List<String> expandedKeywords,
//                                                       String category, Double minPrice, Double maxPrice,
//                                                       Integer page, Integer size) {
//        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//
//        // 主要搜索条件 - 多字段匹配
//        MultiMatchQueryBuilder mainQuery = QueryBuilders.multiMatchQuery(originalQuery)
//                .field("name", 3.0f)          // 商品名称权重最高
//                .field("description", 2.0f)   // 描述权重中等
//                .field("category", 1.5f)      // 分类权重
//                .field("brand", 1.2f)         // 品牌权重
//                .field("tags", 1.0f)          // 标签权重最低
//                .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
//                .fuzziness(Fuzziness.AUTO);
//
//        boolQuery.must(mainQuery);
//
//        // AI扩展的关键词搜索 - 作为should条件提升相关性
//        if (!expandedKeywords.isEmpty()) {
//            for (String keyword : expandedKeywords) {
//                MultiMatchQueryBuilder expandedQuery = QueryBuilders.multiMatchQuery(keyword)
//                        .field("name", 1.5f)
//                        .field("description", 1.0f)
//                        .field("tags", 0.8f)
//                        .type(MultiMatchQueryBuilder.Type.BEST_FIELDS)
//                        .fuzziness(Fuzziness.ONE);
//
//                boolQuery.should(expandedQuery);
//            }
//            boolQuery.minimumShouldMatch(1);
//        }
//
//        // 过滤条件
//        boolQuery.filter(QueryBuilders.termQuery("active", true));
//
//        if (category != null && !category.trim().isEmpty()) {
//            boolQuery.filter(QueryBuilders.termQuery("category", category));
//        }
//
//        if (minPrice != null || maxPrice != null) {
//            RangeQueryBuilder priceRange = QueryBuilders.rangeQuery("price");
//            if (minPrice != null) priceRange.gte(minPrice);
//            if (maxPrice != null) priceRange.lte(maxPrice);
//            boolQuery.filter(priceRange);
//        }
//
//        // 排序：相关性分数 + 销量 + 评分
//        List<org.springframework.data.elasticsearch.core.query.sort.SortBuilder> sorts = new ArrayList<>();
//        sorts.add(org.springframework.data.elasticsearch.core.query.sort.SortBuilders.scoreSort().order(org.springframework.data.domain.Sort.Direction.DESC));
//        sorts.add(org.springframework.data.elasticsearch.core.query.sort.SortBuilders.fieldSort("salesCount").order(org.springframework.data.domain.Sort.Direction.DESC));
//        sorts.add(org.springframework.data.elasticsearch.core.query.sort.SortBuilders.fieldSort("rating").order(org.springframework.data.domain.Sort.Direction.DESC));
//
//        return NativeSearchQuery.builder()
//                .withQuery(boolQuery)
//                .withPageable(PageRequest.of(page, size))
//                .withSorts(sorts)
//                .build();
//    }
//
//    /**
//     * 从AI分析结果中提取扩展关键词
//     */
//    private List<String> extractExpandedKeywords(String aiAnalysis, String originalQuery) {
//        List<String> keywords = new ArrayList<>();
//
//        try {
//            JsonNode analysisNode = objectMapper.readTree(aiAnalysis);
//
//            // 提取关键词
//            JsonNode keywordsNode = analysisNode.path("keywords");
//            if (keywordsNode.isArray()) {
//                keywordsNode.forEach(keyword -> keywords.add(keyword.asText()));
//            }
//
//            // 提取同义词
//            JsonNode synonymsNode = analysisNode.path("synonyms");
//            if (synonymsNode.isArray()) {
//                synonymsNode.forEach(synonym -> keywords.add(synonym.asText()));
//            }
//
//            // 提取扩展查询
//            String expandedQuery = analysisNode.path("expandedQuery").asText();
//            if (!expandedQuery.isEmpty() && !expandedQuery.equals(originalQuery)) {
//                keywords.add(expandedQuery);
//            }
//
//        } catch (JsonProcessingException e) {
//            log.warn("解析AI分析结果失败，使用原始查询", e);
//            keywords.add(originalQuery);
//        }
//
//        return keywords.stream()
//                .distinct()
//                .filter(k -> !k.trim().isEmpty())
//                .collect(Collectors.toList());
//    }
//
//    /**
//     * 分析搜索意图
//     */
//    public Map<String, Object> analyzeSearchIntent(String query) {
//        String analysis = aiService.analyzeSearchQuery(query);
//
//        Map<String, Object> result = new HashMap<>();
//        result.put("originalQuery", query);
//        result.put("analysis", analysis);
//
//        try {
//            JsonNode analysisNode = objectMapper.readTree(analysis);
//            result.put("intent", analysisNode.path("intent").asText());
//            result.put("categories", extractArrayFromJson(analysisNode, "categories"));
//            result.put("keywords", extractArrayFromJson(analysisNode, "keywords"));
//            result.put("synonyms", extractArrayFromJson(analysisNode, "synonyms"));
//
//            JsonNode attributesNode = analysisNode.path("attributes");
//            if (attributesNode.isObject()) {
//                Map<String, String> attributes = new HashMap<>();
//                attributesNode.fields().forEachRemaining(entry ->
//                        attributes.put(entry.getKey(), entry.getValue().asText()));
//                result.put("attributes", attributes);
//            }
//
//        } catch (JsonProcessingException e) {
//            log.warn("解析搜索意图分析结果失败", e);
//            result.put("error", "意图分析解析失败");
//        }
//
//        return result;
//    }
//
//    /**
//     * 从JSON节点中提取数组
//     */
//    private List<String> extractArrayFromJson(JsonNode parentNode, String fieldName) {
//        List<String> result = new ArrayList<>();
//        JsonNode arrayNode = parentNode.path(fieldName);
//        if (arrayNode.isArray()) {
//            arrayNode.forEach(node -> result.add(node.asText()));
//        }
//        return result;
//    }
//
//    /**
//     * 传统搜索（不使用AI）
//     */
//    public SearchResult traditionalSearch(String query, Integer page, Integer size,
//                                          String category, Double minPrice, Double maxPrice) {
//        Pageable pageable = PageRequest.of(page, size,
//                Sort.by(Sort.Direction.DESC, "salesCount", "rating"));
//
//        Page<Product> productPage;
//
//        if (category != null || minPrice != null || maxPrice != null) {
//            // 使用复合条件搜索
//            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
//                    .must(QueryBuilders.multiMatchQuery(query)
//                            .field("name", 2.0f)
//                            .field("description", 1.0f)
//                            .type(MultiMatchQueryBuilder.Type.BEST_FIELDS)
//                            .fuzziness(Fuzziness.AUTO))
//                    .filter(QueryBuilders.termQuery("active", true));
//
//            if (category != null) {
//                boolQuery.filter(QueryBuilders.termQuery("category", category));
//            }
//
//            if (minPrice != null || maxPrice != null) {
//                RangeQueryBuilder priceRange = QueryBuilders.rangeQuery("price");
//                if (minPrice != null) priceRange.gte(minPrice);
//                if (maxPrice != null) priceRange.lte(maxPrice);
//                boolQuery.filter(priceRange);
//            }
//
//            NativeSearchQuery searchQuery = NativeSearchQuery.builder()
//                    .withQuery(boolQuery)
//                    .withPageable(pageable)
//                    .build();
//
//            SearchHits<Product> searchHits = elasticsearchOperations.search(searchQuery, Product.class);
//            List<Product> products = searchHits.getSearchHits().stream()
//                    .map(SearchHit::getContent)
//                    .collect(Collectors.toList());
//
//            return SearchResult.builder()
//                    .query(query)
//                    .products(products)
//                    .totalElements(searchHits.getTotalHits())
//                    .totalPages((int) Math.ceil((double) searchHits.getTotalHits() / size))
//                    .currentPage(page)
//                    .pageSize(size)
//                    .build();
//        } else {
//            // 简单搜索
//            productPage = productRepository.searchProducts(query, pageable);
//
//            return SearchResult.builder()
//                    .query(query)
//                    .products(productPage.getContent())
//                    .totalElements(productPage.getTotalElements())
//                    .totalPages(productPage.getTotalPages())
//                    .currentPage(page)
//                    .pageSize(size)
//                    .build();
//        }
//    }
//}
